package net.schastny.shopmanager.web;

import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import net.schastny.shopmanager.additional.ContactPropertyEditor;
import net.schastny.shopmanager.additional.Dictionary;
import net.schastny.shopmanager.additional.PreOrderPropertyEditor;
import net.schastny.shopmanager.domain.BaseOrder;
import net.schastny.shopmanager.domain.Contact;
import net.schastny.shopmanager.domain.PreOrder;
import net.schastny.shopmanager.service.ContactService;
import net.schastny.shopmanager.service.PreOrderService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class PreOrderController {
	@Autowired
    private PreOrderService preorderService;

	@Autowired
    private ContactService contactService;

	

	/*RequestMapping - Аннотация используется для маппинга урл-адреса запроса на указанный метод или класс. 
	 * Запрос можно маппить как на метод класса, так и на целый класс.
	 *  Допускается указывать конкретный HTTP-метод, который будет обрабатываться (GET/POST), 
	 *  передавать параметры запроса.
	 */

	

    public String listPreOrder(Map<String, Object> map) {
		System.out.println("----- It's listPreOrder");
		
        map.put("preorder", new PreOrder());
        map.put("preorderList", preorderService.listPreOrder());

        return "preorderadd";
    }

	@RequestMapping(value = "/newPreOrder")
    public String newPreOrder(Map<String, Object> map) {
		System.out.println("----- It's newPreOrder");
		//get country
		map.put("countryList",  Dictionary.getDictionary().get("country"));
 
		List<Contact> contactList = contactService.listContact();
	
		map.put("contactList", contactList);
		
        map.put("preorder", new PreOrder());
      //  map.put("preorderList", preorderService.listPreOrder());

        return "preorderadd";
    }
	
/*	@RequestMapping("/")
    public String home() {
        return "redirect:/shop";
    }
*/
	/*ModelAttribute - Аннотация, связывающая параметр метода или возвращаемое значение метода с атрибутом модели,
	 *  которая будет использоваться при выводе jsp-страницы.
	 */
	@RequestMapping(value = "/addPreOrder", method = RequestMethod.POST)
    public String addPreOrder(@ModelAttribute("preorder") PreOrder preorder,
            BindingResult result) {
		
		Authentication auth = SecurityContextHolder.getContext().getAuthentication();
		String name = auth.getName();
		preorder.setPreorderCreatedUser(name);
		preorderService.addPreOrder(preorder);

        return "redirect:/index";
    }
	
	   /**
     * Retrieves the "Edit Existing Record" page
     */
    @RequestMapping(value = "/editPreOrder/{preorderId}", method = RequestMethod.GET)
    public String getEdit(@PathVariable("preorderId") Integer preorderId, Model model) {
    	
    	//get existing BaseOrder
    	PreOrder existingPreorder = preorderService.getPreOrder(preorderId);
    	// Add existing BaseOrder to model
    	model.addAttribute("preorder", existingPreorder);

    	Map<String,String> country = new LinkedHashMap<String,String>();
		country.put("US", "United Stated");
		country.put("UK", "Great Britain");
		model.addAttribute("countryList", country);
 
		List<Contact> contactList = contactService.listContact();
	
		model.addAttribute("contactList", contactList);
    	
    	// This will resolve to /WEB-INF/jsp/edit-record.jsp
		
    	return "preorderadd";
	}
 
    /**
     * Edits an existing record
     */
    @RequestMapping(value = "/editPreOrder/{preorderId}", method = RequestMethod.POST)
    public String postEdit(@PathVariable("preorderId") Integer preorderId, 
    						    @ModelAttribute("preorder") PreOrder preorder) {
	

		// Assign id
    	preorder.setPreorderId(preorderId);

		// Delegate to service
    	preorderService.editPreOrder(preorder);

		// Redirect to url
		return "redirect:/index";
	}
	
	
	/*PathVariable - Аннотация, которая показывает, что параметр метода должен быть связан с переменной из урл-адреса. 
	 */
	@RequestMapping("/deletePreOrder/{preorderId}")
    public String deletePreOrder(@PathVariable("preorderId") Integer preorderId) {

		preorderService.removePreOrder(preorderId);

        return "redirect:/index";
    }	
	
}
